import { isFunction, isObject, isString } from '@/utils/is';

import en from './en.json'; // 英文
import ja from './ja.json'; // 日文
import zhHans from './zh-Hans.json'; // 简体中文
import zhHant from './zh-Hant.json'; // 繁体中文

// key 不能乱写，查看截图 screenshots/i18n.png
const messages = {
  en,
  ja,
  'zh-Hans': zhHans,
  'zh-Hant': zhHant,
};

/**
 * formatI18n('我是{name},身高{detail.height},体重{detail.weight}',{name:'张三',detail:{height:178,weight:'75kg'}})
 * 暂不支持数组
 * @param template 多语言模板字符串，eg: `我是{name}`
 * @param {Object|undefined} data 需要传递的数据对象，里面的key与多语言字符串对应，eg: `{name:'菲鸽'}`
 * @returns
 */
export function formatI18n(template: string, data?: any) {
  return template.replace(/\{([^}]+)\}/g, function (_match, key: string) {
    // console.log(template, data, match, key) // => { detail.height }  detail.height
    const arr = key.trim().split('.');
    let result = data;
    while (arr.length) {
      const first = arr.shift();
      result = result[first];
    }
    return result;
  });
}

/**
 * formatI18nArr('已阅读并同意{0}和{1}','用户协议','隐私政策') -> 已阅读并同意用户协议和隐私政策
 * 不支持 {heavy} {param} 这种具名化的参数形式
 * @param template 多语言模板字符串，eg: `已阅读并同意{0}和{1}`
 * @param {Object|undefined} arg 需要传递的数据对象，里面的key与多语言字符串对应，eg: `['用户协议','隐私政策']`
 * @returns
 */
export function formatI18nArr(template: string, ...arg: any[]) {
  // 使用map来替换{0}, {1}, ...等占位符
  return template.replace(/{(\d+)}/g, (match, index) => {
    const value = arg[index];
    return value !== undefined ? value : match;
  });
}

/**
 * 获取locale根目录下原始的语言模板，用于处理uniapp内置语言模板翻译逻辑。
 * @param { string } key 多语言的key，eg: "app.name"
 * @returns {string} 返回原始的多语言模板，eg: "{heavy}KG"
 */
function getTemplateByKey(key: string): string {
  if (!key) {
    return '';
  }
  const locale = uni.getLocale();

  const message = messages[locale]; // 拿到某个多语言的所有模板（是一个对象)
  if (!message) {
    return '';
  }
  if (Object.keys(message).includes(key)) {
    return message[key];
  }
  return '';
}

/** 执行locale根目录下原始的语言模板翻译逻辑 */
export function t(key: string): string;
export function t(key: string, arg: any): string;
export function t(key: string, ...arg: any): string {
  if (!key) return '';
  const path = key;
  let temp = getTemplateByKey(path);
  temp = isString(temp) ? temp : path;
  if (isFunction(temp)) {
    return temp(...arg);
  }
  if (!arg) {
    return formatI18n(temp);
  } else {
    if (arg.length === 1 && isObject(arg[0])) {
      return formatI18n(temp, arg[0]);
    } else {
      return formatI18nArr(temp, ...arg);
    }
  }
  //   return formatI18n(getTemplateByKey(key), data)
}
